// 引入必要的FreeRTOS库
#include "freertos/FreeRTOS.h"
// 引入FreeRTOS任务相关库
#include "freertos/task.h"
// 引入ESP32系统库，包括硬件初始化等功能
#include "esp_system.h"
// 引入Wi-Fi和事件库，用于Wi-Fi连接和事件处理
#include "esp_wifi.h"
// 引入事件库，用于处理Wi-Fi事件
#include "esp_event.h"
// 引入非易失性存储（NVS）库，用于存储Wi-Fi配置等信息
#include "nvs_flash.h"
// 添加对<string.h>的引用以使用strlen
#include <string.h>


#define EXAMPLE_ESP_WIFI_SSID      "expample_ssid" // Wi-Fi接入点的SSID（服务集标识符）
#define EXAMPLE_ESP_WIFI_PASS      "12345678"     // Wi-Fi接入点的密码
#define EXAMPLE_ESP_WIFI_CHANNEL   11               // Wi-Fi接入点的频道，通常在1-13之间选择
#define EXAMPLE_MAX_STA_CONN       16              // Wi-Fi接入点允许的最大连接客户端数量


// 定义初始化Wi-Fi软AP的函数
void wifi_init_softap(void)
{
    // 初始化网络接口
    ESP_ERROR_CHECK(esp_netif_init());
    // 初始化Wi-Fi配置结构体，使用默认配置
    wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
    // 初始化Wi-Fi
    ESP_ERROR_CHECK(esp_wifi_init(&cfg));

    // Wi-Fi配置结构体
    wifi_config_t wifi_config = {
        .ap = {
            // 设置SSID
            .ssid = EXAMPLE_ESP_WIFI_SSID,
            // 设置SSID长度
            .ssid_len = strlen(EXAMPLE_ESP_WIFI_SSID), 
            // 设置频道
            .channel = EXAMPLE_ESP_WIFI_CHANNEL,
            // 设置密码
            .password = EXAMPLE_ESP_WIFI_PASS,
            // 设置最大连接客户端数
            .max_connection = EXAMPLE_MAX_STA_CONN,
            // 设置认证模式，初始为WPA/WPA2混合模式
            .authmode = WIFI_AUTH_WPA_WPA2_PSK,
        },
    };
    // 如果密码为空，设置为开放模式
    if (strlen(EXAMPLE_ESP_WIFI_PASS) == 0)
    {
        wifi_config.ap.authmode = WIFI_AUTH_OPEN;
    }

    // 设置Wi-Fi模式为AP模式
    ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_AP));
    // 设置Wi-Fi配置
    ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_AP, &wifi_config));
    // 启动Wi-Fi
    ESP_ERROR_CHECK(esp_wifi_start());
}

// 应用主函数
void app_main(void)
{
    // 初始化NVS闪存分区，用于Wi-Fi组件的数据存储
    esp_err_t ret = nvs_flash_init();
    // 如果初始化失败，尝试擦除分区并重新初始化
    if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND)
    {
        ESP_ERROR_CHECK(nvs_flash_erase());
        ret = nvs_flash_init();
    }
    // 处理初始化错误
    ESP_ERROR_CHECK(ret);
    // 初始化Wi-Fi软AP
    wifi_init_softap();
}